package com.zzz.codegen.config;

import com.zzz.codegen.entity.TableVO;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.File;
import java.io.Serializable;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

@Accessors(chain = true)
@Setter
@Getter
public class TemplateConfig implements Serializable {

    private static final long serialVersionUID = 2349107576838988580L;

    private TableVO table;//冗余

    private GroupConfig group;//冗余

    /**
     * 生成类型常量
     *
     * @see com.zzz.codegen.constant.GenTypeConst
     */
    private String genType;

    /**
     * 模板路径
     */
    private String templatePath;

    /**
     * 当没有模板路径时可直接填模板内容
     */
    private String templateContent;

    /**
     * 是否启用生成
     */
    private boolean generateEnable;

    /**
     * 包路径
     */
    private String packagePath = "";

    /**
     * XXX 类的前缀。
     */
    private String classPrefix = "";

    /**
     * XXX 类的后缀。
     */
    private String classSuffix = "";

    /**
     * 组装最后生成文件路径的方法。
     */
    private Function<TemplateConfig, File> fileBuilder;

    /**
     * extends 和 implements 类需要 import 的包。
     */
    private String[] classImports;

    /**
     * 继承的父类 simpleName
     */
    private String superClassName;

    /**
     * 实现类 simpleName
     */
    private String interfacesName;

    /**
     * 是否覆盖之前生成的文件。
     */
    private boolean overwriteEnable;

    /**
     * XXX 是否使用 Lombok 注解。
     */
    private boolean withLombok;

    /**
     * XXX 是否使用 Swagger 注解。
     */
    private boolean withSwagger;

    /**
     * XXX 是否启用 Active Record 功能。
     */
    private boolean withActiveRecord;

    /**
     * 生成 REST 风格的 Controller。
     */
    private boolean restStyle = true;

    /**
     * 是否添加 {@code @Mapper} 注解。
     */
    private boolean mapperAnnotation;

    /**
     * 是否生成缓存样例代码。
     */
    private boolean cacheExample;

    /**
     * 是否生成文件
     */
    private boolean createFileEnable;

    public String buildClassName() {
        return getClassPrefix() + table.getEntityName() + getClassSuffix();
    }

    public List<String> buildPropertiesImports() {
        return table.getColumns().stream().map(t -> t.getPropertyType()).distinct().collect(Collectors.toList());
    }
}
